9. 理解 Embedding

大模型中的 Embedding(词嵌入)到底是什么?

如果说 Transformer 是大模型的大脑,那么 Embedding 就是大模型的“词典”。

所有文本进入模型的第一步:

	"我爱机器学习"
        │
        ▼
	Tokenizer
        │
        ▼
	[123, 456, 789]
        │
        ▼
	Embedding
        │
        ▼
	[768维向量]
	[768维向量]
	[768维向量]

Transformer 根本不认识文字。

它只认识数字。

Embedding 的作用就是:

把离散的 Token ID 转换成连续的向量(Vector)。


一、为什么需要 Embedding?

先想一个问题:

Tokenizer 输出的是什么?

"cat" → 1234
"dog" → 5678

模型看到的是:

1234
5678

但这里有个巨大问题:

1234 和 5678

只是编号。

就像:

张三 → 员工001
李四 → 员工002

不能因为:

002 > 001

就说明李四比张三厉害。

Token ID 没有任何语义。

所以需要转换成:

cat → 向量
dog → 向量

例如:

cat
 ↓
[0.3, 1.2, -0.7, ...]

这样模型才能进行数学运算。


二、从 One-Hot 到 Dense Embedding 的演进

这是 NLP 历史上的一次重大进步。


第一代:One-Hot

假设词表:

["cat","dog","apple","car"]

共有:

V = 4

那么:

cat
 ↓
[1,0,0,0]

dog
 ↓
[0,1,0,0]

问题1:太稀疏

如果词表:

V = 100000

那么:

cat = [0,0,0,0,0,0,1,0,0,...]

99999 个 0。

浪费内存。


问题2:没有语义

cat = [1,0,0,0]
dog = [0,1,0,0]

距离:

√2

而:

cat
car

距离也是:

√2

模型认为:

cat ≈ dog ≈ car

完全不合理。


三、Dense Embedding 的出现

2003 年 Bengio 在《A Neural Probabilistic Language Model》中首次系统使用了神经网络词向量思想,随后 Word2Vec 将其发扬光大。(Reddit)

思想:

不要用 100000 维 One-Hot 改成300维连续向量

例如:

cat
 ↓
[0.21,
 1.34,
 -0.53,
 ...
]

此时:

cat
dog

可能变成:

cat = [0.2,1.3,-0.5]

dog = [0.3,1.1,-0.4]

距离很近。


而:

car = [-2.5,0.8,4.1]

距离很远。


于是:

语义相似
   ↓
向量接近

这就是 Embedding 的核心思想。Word2Vec 通过上下文预测学习出这种语义空间,使得相似上下文中的词拥有相近向量。(en.wikipedia.org)


四、Embedding 本质是什么?

很多人学到这里会觉得很神秘。

实际上:

本质就是一个矩阵

假设:

词表大小 V = 50000

隐藏维度 d = 768

那么:

Embedding shape = [50000,768]

即:

        768列
┌─────────────────┐
│ token0          │
│ token1          │
│ token2          │
│ ...             │
│ token49999      │
└─────────────────┘

每一行:

一个 Token 的向量

五、nn.Embedding 的本质

很多人以为:

nn.Embedding

很复杂。

其实源码逻辑约等于:

weight[token_id]

例如:

embedding.weight.shape = [50000,768]

输入:

ids = [100,200,300]

输出:

embedding.weight[100]
embedding.weight[200]
embedding.weight[300]

拼起来:

[3,768]

本质:

查表

仅此而已。


六、为什么 Embedding 比 One-Hot 高效?

One-Hot:

50000维

Embedding:

768维

压缩比例:

50000
─────
768

≈ 65倍

同时还保留语义信息。

因此:

One-Hot
    ↓
Dense Embedding

成为 NLP 的标准方案。(pmc.ncbi.nlm.nih.gov)


七、d_model = 768 到底是什么意思?

例如 BERT Base:

d_model = 768

意思是:

每个 Token 用768个数字表示

即:

token
  ↓
[768维向量]

Transformer 整个网络都围绕这个维度运行:

Embedding
      │
      ▼
[B,L,768]

Attention
      │
      ▼
[B,L,768]

FFN
      │
      ▼
[B,L,768]

768 维可以理解为:

768个特征槽位

例如(仅示意):

维度17 → 动物属性

维度32 → 国家属性

维度105 → 动词属性

真实模型中的维度不会这么明确,而是分布式表示。


八、Embedding 参数量怎么算?

公式:

Params=V×dmodel

例如:

词表 V = 50000

d_model = 768

则:

50000×768=38,400,000

即:

3840万参数

如果 FP16:

3840万 × 2字节 ≈ 76.8MB

可以发现:

Embedding层
其实非常占参数

九、什么是 Weight Tying(权重共享)?

这是很多人第一次看 GPT 代码时最困惑的地方。


输入时:

Token ID
    │
    ▼
Embedding
    │
    ▼
768维向量

使用矩阵:

ERV×d

输出时:

Transformer 最终得到:

hidden state

[B,L,768]

需要预测:

下一个 Token

于是:

768
 ↓
50000

即:

logits=hWT

其中:

WRV×d

发现了吗?

形状完全一样:

Embedding

[V,d]

Output Layer

[V,d]

于是 Press & Wolf(2016)提出:

直接共用同一个矩阵

即:

W=E

这样可以减少参数量并提升语言模型效果。(Hugging Face)


十、Weight Tying 为什么有效?

原来

Input Embedding 50000×768
+
Output Projection 50000×768

参数:

7680万

共享后

只保留一个矩阵

参数:

3840万

直接减半。


另外:

输入和输出本质上都在描述:

Token 的语义空间

共享后语义更一致。(Hugging Face)


十一、Word2Vec 和 Transformer Embedding 的区别

很多初学者容易混淆。


Word2Vec

训练目标:

根据上下文预测单词

或者:

根据单词预测上下文

(CBOW / Skip-Gram)(en.wikipedia.org)

得到:

一个静态向量

例如:

bank

永远同一个向量

Transformer

Embedding 初始也是:

一个静态向量

例如:

bank

先查表得到:

e_bank

随后经过:

Layer1 Attention
Layer2 Attention
...
LayerN Attention

不断更新。

最终:

bank(金融)

bank(河岸)

会变成不同向量。


即:

Word2Vec

静态Embedding
bank = 固定向量

Transformer

上下文Embedding
bank(金融) ≠ bank(河岸)

这是 Transformer 最大的进步之一。(quantml.org)


一张图看懂 Embedding

Pasted image 20260625181839.png

一句话总结:

Embedding 本质上就是一个大小为 [词表大小 × 隐藏维度] 的可训练查找表。Word2Vec 让 NLP 从 One-Hot 进入 Dense Vector 时代,而 Transformer 则在此基础上通过 Attention 将静态词向量进一步演化为上下文相关的动态语义表示。(en.wikipedia.org)